package com.example.designpatterns.proxy.remote;

import com.example.designpatterns.proxy.Image;

/**
 * RemoteImage类 - 远程代理示例
 * 模拟访问远程服务器上的图像
 */
public class RemoteImage implements Image {
    private String filename;
    private String serverUrl;
    private long size;
    private boolean isLoaded;
    
    /**
     * 创建远程图像对象
     * @param filename 图像文件名
     * @param serverUrl 远程服务器URL
     */
    public RemoteImage(String filename, String serverUrl) {
        this.filename = filename;
        this.serverUrl = serverUrl;
        this.isLoaded = false;
        
        System.out.println("远程图像创建: " + filename + " (来自服务器: " + serverUrl + ")");
        
        // 模拟从远程服务器获取图像元数据（不下载完整图像）
        fetchMetadata();
    }
    
    /**
     * 模拟从远程服务器获取图像元数据
     */
    private void fetchMetadata() {
        System.out.println("从服务器获取图像元数据: " + serverUrl + "/" + filename);
        
        try {
            // 模拟网络延迟
            Thread.sleep(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        
        // 模拟图像大小计算
        this.size = filename.length() * 100 + 200;
        
        System.out.println("获取到图像元数据: 大小 = " + size + " KB");
    }
    
    /**
     * 模拟从远程服务器下载图像
     */
    private void downloadImage() {
        if (isLoaded) {
            return;
        }
        
        System.out.println("开始从服务器下载图像: " + serverUrl + "/" + filename);
        
        try {
            // 模拟下载延迟，与图像大小成正比
            Thread.sleep(size / 20);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        
        isLoaded = true;
        System.out.println("图像下载完成: " + filename + " (" + size + " KB)");
    }
    
    @Override
    public void display() {
        // 需要下载图像才能显示
        if (!isLoaded) {
            downloadImage();
        }
        System.out.println("显示远程图像: " + filename);
    }
    
    @Override
    public String getFilename() {
        return filename;
    }
    
    @Override
    public long getSize() {
        return size;
    }
    
    /**
     * 获取远程服务器URL
     * @return 服务器URL
     */
    public String getServerUrl() {
        return serverUrl;
    }
    
    /**
     * 检查图像是否已下载
     * @return 是否已下载
     */
    public boolean isLoaded() {
        return isLoaded;
    }
} 